﻿using System;
using System.Collections.Generic;
using System.Xml.Serialization;


namespace AnOtherBlog.Core
{
	/// <summary>
	/// Una página se define para mostrar contenido HTML en el blog
	/// </summary>
	public class Page : BlogBaseClass<Page, Guid>
	{
		#region Constructor

		/// <summary>
		/// Constructor por defecto
		/// </summary>
		public Page()
		{
			base.Id = Guid.NewGuid();
			base.DateCreated = DateTime.Now;

			this.ShowInList = true;
		}

		#endregion

		#region Fields and Properties

		/// <summary>
		/// Identificador único de la página
		/// Id de la clase base
		/// </summary>
		[XmlIgnore()]
		public Guid PageID
		{
			get
			{
				return this.Id;
			}
			set
			{
				this.Id = value;
			}
		}

		private string _Title;
		/// <summary>
		/// Título de la página
		/// </summary>
		public string Title
		{
			get
			{
				return _Title;
			}
			set
			{
				_Title = value ?? string.Empty;
			}
		}

		private string _Description;
		/// <summary>
		/// Descripción de la página (SEO)
		/// </summary>
		public string Description
		{
			get
			{
				return _Description;
			}
			set
			{
				_Description = value ?? string.Empty;
			}
		}

		// TODO: Hay que corregir las referencias Content (así estaba en el prototipo)
		private string _PageContent;
		/// <summary>
		/// Contenido o cuerpo de la página
		/// </summary>
		public string PageContent
		{
			get
			{
				return _PageContent;
			}
			set
			{
				_PageContent = value ?? string.Empty;
			}
		}

		private string _Keywords;
		/// <summary>
		/// Palabras cláves (SEO)
		/// </summary>
		public string Keywords
		{
			get
			{
				return _Keywords;
			}
			set
			{
				_Keywords = value ?? string.Empty;
			}
		}

		private bool _IsPublished;
		/// <summary>
		/// Está publicada
		/// </summary>
		public bool IsPublished
		{
			get
			{
				return _IsPublished;
			}
			set
			{
				_IsPublished = value;
			}
		}

		private bool _IsFrontPage;
		/// <summary>
		/// Es la Página que se muestra al principio del blog
		/// </summary>
		public bool IsFrontPage
		{
			get
			{
				return _IsFrontPage;
			}
			set
			{
				_IsFrontPage = value;
			}
		}

		private Guid _Parent;
		/// <summary>
		/// Identificador de la página padre
		/// </summary>
		public Guid Parent
		{
			get
			{
				return _Parent;
			}
			set
			{
				_Parent = value;
			}
		}

		private bool _ShowInList;
		/// <summary>
		/// Se muestra en la lista de páginas
		/// </summary>
		public bool ShowInList
		{
			get
			{
				return _ShowInList;
			}
			set
			{
				_ShowInList = value;
			}
		}

		private string _Slug;
		/// <summary>
		/// El Slug de la página es un URL utilizado para acceder a la página
		/// </summary>
		public string Slug
		{
			get
			{
				if (string.IsNullOrEmpty(_Slug))
					return Util.RemoveIllegalCharacters(Title);
				return _Slug;
			}
			set
			{
				_Slug = value ?? string.Empty;
			}
		}

		private int _BlogID;
		/// <summary>
		/// Identificador único del blog (en esta base de datos)
		/// </summary>
		public int BlogID
		{
			get
			{
				return _BlogID;
			}
			set
			{
				_BlogID = value;
			}
		}

		
		#endregion

		public enum PageSort
		{
			ID = 0,
			Title = 1,
			DateCreated = 2,
			DateModified = 3,
		}


		#region Persist Methods

		/// <summary>
		/// Obtiene una página de acuerdo a su id.
		/// </summary>
		/// <param name="id">Identificador de la página</param>
		/// <returns>Objeto página</returns>
		public static Page Load(Guid id)
		{
			return Providers.DataAccess.PageSelect(id);
		}

		/// <summary>
		/// Obtiene una colección con todas las páginas
		/// CUIDADO si hay muchas páginas esto se come toda la memoria !!!!!!!!!!!!!!!!!!!!!!!!
		/// </summary>
		/// <returns>Colección con todas las páginas del blog</returns>
		public static List<Page> LoadAll()
		{
			return Providers.DataAccess.PageList();
		}

		public static List<Page> LoadAll(PageSort sort)
		{
			List<Page> pages = LoadAll();
			switch (sort)
			{
				case PageSort.ID :
					//pages.Sort(delegate(Page p1, Page p2) { return String.Compare(p1.Title, p2.Title); });
					break;

				case PageSort.Title :
					pages.Sort(delegate(Page p1, Page p2) { return String.Compare(p1.Title, p2.Title); });
					break;

				case PageSort.DateCreated:
					pages.Sort(delegate(Page p1, Page p2) { return DateTime.Compare(p1.DateCreated, p2.DateCreated); });
					break;

				case PageSort.DateModified:
					pages.Sort(delegate(Page p1, Page p2) { return DateTime.Compare(p1.DateModified, p2.DateModified); });
					break;

			}
			return pages;			
		}
		/// <summary>
		/// Almacena la página
		/// </summary>
		public void Save()
		{
			this.DateModified = DateTime.Now;
			Providers.DataAccess.PageInsert(this);
		}

		#endregion


	}

}
